switch (Message) { case WM_INITMENU: // Wenn Menü aufgebaut wird: // Nicht verfügbare Menüs abblenden, z.B. "Paste", // wenn kein Text in der Zwischenablage steht. if(OpenClipboard(hEditWnd)) { if(IsClipboardFormatAvailable(CF_TEXT)) EnableMenuItem(wParam, IDM_B_PASTE, MF_ENABLED); else EnableMenuItem(wParam, IDM_B_PASTE, MF_GRAYED); CloseClipboard(); } break; case WM_COMMAND: // Window-Kommando switch (wParam) // Bearbeite Menüs { case IDM_D_NEU: // Neue Datei /* Wenn vorherige Datei ungesichert, Frage ob sichern. */ if (!QuerySaveFile(hWnd)) return (NULL); bChanges = FALSE; // Nichts geändert FileName[0] = 0; // Kein File-Name // Lege neuen Edit-Puffer an: SetNewBuffer(hWnd, NULL, Untitled); break; case IDM_D_OEFFNEN: // Teste, ob aktuelle Datei gesichert if (!QuerySaveFile(hWnd)) return (NULL); // Zeige Standard-Dialog, bewerte User-Wahl, // lese Datei ein. break; case IDM_D_SICHERN: // Wenn Filename leer, gehe zu "Sichern unter" if (!FileName[0]) goto saveas; // Wenn File geändert, speicher ihn if (bChanges) SaveFile(hWnd); break; case IDM_D_SICHERNUNTER: saveas: // Zeige Standard-Dialog, bewerte User-Wahl, // lese Datei ein. SaveFile(hWnd); break; case IDM_D_DRUCKEN: // Teste, ob Drucker verfügbar hPr = GetPrinterDC(); if (!hPr) { /* Meldung und Abbruch*/ } // Definniere Abort-Dialog. // Beschaffe Auflösung einer Druckerseite // und Zeilenhöhe. Rechne Anzahl Zeilen/Seite. // Lege kompatiblen DC an. // Drucke via TextOut(). // Letzte Seit vorschieben und Ende // Abort-Dialog abbauen // Speicher freigeben break; case IDM_D_DRUCKERINSTALLATION: /* Beschaffe Druckerkontext. Funktion ermittelt auch Druckerdaten. */ // Lade Druckertreiber (Name in WIN.INI) /* Ermittle Zeiger auf Druckerinst.-Funktion und rufe sie auf */ lpfnDevmode = GetProcAddress(hLibrary, "EXTDEVICEMODE"); nResult = (*lpfnDevmode) (hWnd, hLibrary, &devmode, (LPSTR) szDevice, (LPSTR) szOutput, NULL, NULL, DM_COPY | DM_PROMPT); break; case IDM_D_INFO: // Zeige About-Dialog lpfnProcAbout = MakeProcInstance(About, hInst); DialogBox(hInst, "AboutBox", hWnd, lpfnProcAbout); FreeProcInstance(lpfnProcAbout); break; case IDM_D_BEENDEN: QuerySaveFile(hWndMain); PostMessage(hWnd, WM_CLOSE, 0,0); break; // Das ganze Bearbeiten-Menü eines Editors // kann Windows erledigen case IDM_B_UNDO: SendMessage(hEditWnd, WM_UNDO, 0, 0L); break; case IDM_B_COPY: SendMessage(hEditWnd, WM_COPY, 0, 0L); break; case IDM_B_CUT: SendMessage(hEditWnd, WM_CUT, 0, 0L); break; case IDM_B_PASTE: SendMessage(hEditWnd, WM_PASTE, 0, 0L); break; case IDM_B_ALL: SendMessage(hEditWnd, EM_SETSEL, 0, MAKELONG(0, 32767)); break; case IDM_B_CLEAR: SendMessage(hEditWnd, WM_CLEAR, 0, 0L); break; case IDM_B_DEL: OpenClipboard(hEditWnd); EmptyClipboard(); CloseClipboard(); break; case IDM_B_FIND: // Läuft via Standard-Dialog break; case IDM_B_REPLACE: // Läuft via Standard-Dialog break; default: return DefWindowProc(hWnd, Message, wParam, lParam); } // End of switch wParam // Weitere Windows-Messages case WM_QUERYENDSESSION: /* Wenn Windows beendet wird und ein File ungesichert, Frage ob OK. */ return (QuerySaveFile(hWnd)); case WM_SETFOCUS: // Window hat Fokus erhalten // Setze Caret-Cursor break; case WM_SIZE: // Größe neu // in lParam steht neue Width u. Height MoveWindow(hEditWnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); break; case WM_PAINT: // Clear Background memset(&ps, 0x00, sizeof(PAINTSTRUCT)); hDC = BeginPaint(hWnd, &ps); SetBkMode(hDC, TRANSPARENT); EndPaint(hWnd, &ps); break; case WM_CLOSE: DestroyWindow(hWnd); if (hWnd == hWndMain) PostQuitMessage(0); break; default: return DefWindowProc(hWnd, Message, wParam, lParam); } BOOL FAR PASCAL About(HWND hDlg, WORD Message, WORD wParam, LONG lParam) { switch (Message) { case WM_INITDIALOG: cwCenter(hDlg, 0); return TRUE; case WM_COMMAND: if (wParam == IDOK || wParam == IDCANCEL) return EndDialog(hDlg, TRUE); break; } return FALSE; }